<!DOCTYPE html>
<html lang = "en">
<head>
    <meta charset = "UTF-8">
    <title>Title</title>

    <!-- 本章主要包括 -->
    <!-- 判断类型typeof -->
    <!-- 数据类型转换 parseInt -->
    <!-- 闭包 -->
    <!-- js命名规范 -->
    <!-- json-->
    <!-- for in 循环-->
    <!-- 可变参数arguments-->
    <script>
        //=====================================================================
        //通过typeof来判断变量的类型
        let a = 'aaa';
        console.log(typeof a);  //string

        a = 1;
        console.log(typeof a);  //number




        //=====================================================================
        //数据类型的转换
        //parseInt:转换整数.当遇到第一个非数字后会返回前面已经读取的数字; 如果一个都没读取则返回NaN(not a number)
        console.log(parseInt('12px34'));    //12
        console.log(parseInt('px12'));      //NaN
        console.log(123 + parseInt('a'));   //NaN;因为任何数与nan进行运算都会返回nan
        console.log(parseInt('a') == parseInt('a'));    //false; NaN之间不会相等,这原来貌似是一个bug
        console.log(parseInt('a') === parseInt('a'));    //false; 结果是一样的
        console.log(isNaN(parseInt('a')));      //true;专门用来判断NaN的函数

        //parseFloat:转换浮点数
        console.log(parseFloat('12.1')+1);  //13.1
        console.log(parseFloat('12')+1);    //13; 不会添加.0

        //隐式类型转换
        console.log(1=='1');    //true; 会先进行类型转换,再进行值比较
        console.log(1==='1');    //false;
        //对于非基本类型(arr,obj) == 和 === 是没区别的



        //=====================================================================
        //闭包,子函数可以使用父函数的局部变量
        function aaa() {
            let a = 1;
            //bbb函数就形成了一个闭包
            function bbb() {
                console.log(a+1);
            }
            bbb();          //2
            console.log(a); //1,并不会影响a原来的值
        }
        aaa();


        //=====================================================================
        //js命名规范
        //匈牙利命名法+驼峰
        //oDiv代表这个div是对象object
        //aDiv则代表整个div是数组array
        //以此类推



        //=====================================================================
        //json
        let json = {
            a:1,
            b:'b',
            c:true
        };
        //json是没有length的
        console.log(json.length);   //undefined


        //for in循环
        let arr = [1,2,3,4,5];
        for(let i in arr){
            console.log(arr[i]);
        }

        //也可以用于遍历json
        for(let ele in json) {
            console.log(json[ele]);     //json的下标是key
        }



        //=====================================================================
        //可变参数arguments
        // function sum(...args) {  //现在的写法
        function sum() {
            // console.log(args.length);
            console.log(arguments.length);  //以前的写法,注意arguments是固定写法不可变
            console.log(arguments[0]);      //arguments的本质是类数组,但没有数组的方法
            let res = 0;
            for (let num in arguments) {
                if (!isNaN(parseInt(num))) res += parseInt(num);
            }
            return res;     //返回值只能是一个(和java一样)
        }
        console.log('sum',sum(1, 2, 3, 4, 5,'b'));  //添加了非数字的样本,通过isNaN来判断

        //如果希望获取已知类型的可变参数(例如,肯定知道会传入name和age,但可能传入其他未知信息的时候)
        function analysis(name, age) {
            console.log('名字:',name, '年龄',age);
            //读取剩余的参数信息
            for (let i = 2; i < arguments.length; i++) {
                console.log('其他信息',arguments[i])
            }
        }
        analysis('狗蛋',12,'和大柱是好朋友','喜欢同桌小翠');
    </script>
</head>

<body>

<div>

</div>

</body>
</html>